package com.kyl.base;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * BaseVo类是VO基类，提供了基础的实体属性，如主键、创建时间、修改时间等。
 * 该类主要用于实体对象的序列化和反序列化，以及在不同层次之间传递数据。
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseVo implements Serializable {
    /**
     * 主键，用于唯一标识一个实体对象。
     */
    @ApiModelProperty(value = "主键")
    private Long id;

    /**
     * 创建时间，表示实体对象创建的时间。
     */
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//get
    protected LocalDateTime createTime;

    /**
     * 创建日期，仅包含创建时间的日期部分。
     */
    @ApiModelProperty(value = "创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")//get
    protected String createDay;

    /**
     * 修改时间，表示实体对象最后一次修改的时间。
     */
    @ApiModelProperty(value = "修改时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//get
    protected LocalDateTime updateTime;

    /**
     * 创建者，表示创建该实体对象的用户的用户名。
     */
    @ApiModelProperty(value = "创建者:username")
    private Long createBy;

    /**
     * 更新者，表示最后一次修改该实体对象的用户的用户名。
     */
    @ApiModelProperty(value = "更新者:username")
    private Long updateBy;

    /**
     * 是否有效，用于标识实体对象的状态。
     */
    @ApiModelProperty(value = "是否有效")
    protected String dataState;

    /**
     * 备注，用于存储实体对象的附加信息。
     */
    @ApiModelProperty(value = "备注")
    private String remark;

    /**
     * 创建人类型，用于区分创建者的来源，1代表前台用户，2代表后台用户。
     */
    @ApiModelProperty(value = "创建人类型 1 前台 2后台")
    private Integer createType;

    /**
     * 创建人名称，存储创建者的名称。
     */
    @ApiModelProperty(value = "创建人名称")
    private String creator;

    /**
     * 后台管理端创建人名称，专门用于存储后台管理员的名称。
     */
    @ApiModelProperty(value = "后台管理端创建人名称")
    private String adminCreator;

    /**
     * 更新人名称，存储最后一次更新者的名称。
     */
    @ApiModelProperty(value = "更新人名称")
    private String updater;

    /**
     * 构造方法，用于初始化BaseVo对象。
     *
     * @param id        实体对象的主键
     * @param dataState 实体对象的数据状态
     */
    public BaseVo(Long id, String dataState) {
        this.id = id;
        this.dataState = dataState;
    }
}
